<!DOCTYPE html>












  


<html class="theme-next gemini use-motion" lang="Chinese">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"/>
<meta name="theme-color" content="#222">












<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />






















<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=6.4.0" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.4.0">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=6.4.0">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=6.4.0">


  <link rel="mask-icon" href="/images/logo.svg?v=6.4.0" color="#222">









<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '6.4.0',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: false,
    fastclick: false,
    lazyload: false,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>


  




  <meta property="og:type" content="website">
<meta property="og:title" content="政子的博客">
<meta property="og:url" content="http://blog.zhengzi.me/page/4/index.html">
<meta property="og:site_name" content="政子的博客">
<meta property="og:locale" content="Chinese">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="政子的博客">






  <link rel="canonical" href="http://blog.zhengzi.me/page/4/"/>



<script type="text/javascript" id="page.configurations">
  CONFIG.page = {
    sidebar: "",
  };
</script>

  <title>政子的博客</title>
  









  <noscript>
  <style type="text/css">
    .use-motion .motion-element,
    .use-motion .brand,
    .use-motion .menu-item,
    .sidebar-inner,
    .use-motion .post-block,
    .use-motion .pagination,
    .use-motion .comments,
    .use-motion .post-header,
    .use-motion .post-body,
    .use-motion .collection-title { opacity: initial; }

    .use-motion .logo,
    .use-motion .site-title,
    .use-motion .site-subtitle {
      opacity: initial;
      top: initial;
    }

    .use-motion {
      .logo-line-before i { left: initial; }
      .logo-line-after i { right: initial; }
    }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="Chinese">

  
  
    
  

  <div class="container sidebar-position-left 
  page-home">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">政子的博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
    
      
        <p class="site-subtitle">强迫症|学习者|伪文青</p>
      
    
  </div>

  <div class="site-nav-toggle">
    <button aria-label="Toggle navigation bar">
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>



<nav class="site-nav">
  
    <ul id="menu" class="menu">
      
        
        
        
          
          <li class="menu-item menu-item-home">
    <a href="/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-home"></i> <br />Home</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-about">
    <a href="/about/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-user"></i> <br />About</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-tags">
    <a href="/tags/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />Tags</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-archives">
    <a href="/archives/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />Archives</a>
  </li>

      
      
    </ul>
  

  

  
</nav>



  



</div>
    </header>

    


    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
            

          
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/11/30/e7-a9-ba/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/11/30/e7-a9-ba/" itemprop="url">
                  空
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-11-30 00:19:47" itemprop="dateCreated datePublished" datetime="2016-11-30T00:19:47+08:00">2016-11-30</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/随笔/" itemprop="url" rel="index"><span itemprop="name">随笔</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>就在刚刚，我还在对着这个题目窃喜——既然是“空”，当然不需要一个字的正文。因为数据库中的Null就是空。 然而，我却应景地忆起了午时地天“空”。 时光广场，四周仰望，皑皑一片。不是白雪，不是雾霾，却只能去用皑皑两字形容——只是因为太空，颜色都没有，真的太空了。嗯，我第一次开始认真考虑“太空”一词的来由。 仅仅是因为昨夜一阵秋风？当然不。秋风只是卷走了树梢的残叶，却没有带来“空”。那我所见的皑皑之状径为何物，它是不是空？</p>
<p>——2016年11月20日下午1：48</p>
<hr>
<p>今天的主题还是空。</p>
<p>我放空自己，力求均匀地吸气吐气。双手贴在键盘上，不由自主地开始打字。我像一个刚刚学习写作的初中生一样，不知这篇文章会写成什么样子。这样一定也算作空。</p>
<p>最近愈发繁忙，给自己留的思考时间愈发地少，这不是个好兆头。我还是要尽量每周给自己留下几个小时的时间什么都不去做，只是放空去想，像现在这样。</p>
<p>看了这一阵儿很火的一部片子《西部世界》，每当看完以后，我就会觉得已经辨认不清我所存在的世界，我的自由意志，究竟是真实的存在，还是不小心昨天被一个脑残编剧设定好的。</p>
<p>但是耳边音乐响起，我每每会被带入其中，我深切地体会到，那时候每一段思绪，每一段意识都感觉是真正存在的。我会感觉到一段曲子的优美或者崇高；也能体会到其演绎的是悲剧还是戏剧。</p>
<p>这一刻，我能感到，我是真实的。我的存在，并不是被我在思考定义的，而是被我在感受，我体会到这种超越而涌现出来的。</p>
<p>所以，我开始去认真思考，从不知多久之前以来，就觉得完全正确，从未起疑之事——真理是存在于在不断的公式一般的推理求证中，还是之于我们的感悟到超越的存在之中。</p>
<p>在之前一直有考虑过，鲁迅究竟有没有那么大的能耐，怎么敢那么狂妄，以笔为枪？现在终于可以理解，一部伟大的作品竟可以唤醒多少世人，可以对于历史的进程有多么长远的影响。</p>
<p>前些日子接触到了宗先生的《美学散步》，我在想当时的北大学生可是有何等的幸运，可以每每在未名湖边碰见正在散步的这见这位充满智慧的老人，听他将他的广袤宇宙娓娓道来。我感到他虽不像尼采的一生那样预见了历史，但是他在他存在的时空中才是真正活着，每时每刻都在活着的人。奈何我对于他的思考理解并不深刻，不知还要花多少年才能真正读懂一二。</p>
<p><a href="http://music.163.com/#/song?id=26344055" target="_blank" rel="noopener">http://music.163.com/#/song?id=26344055</a></p>
<p>脑袋中又响起了骆集益大师的曲目，犹入福流之境。当流淌至《榣山遗韵》，太子长琴和应龙之于瑶山的回忆就像一幅好的书法一样，如流水般铺陈开来，有时细如游丝，有时形如泼墨。我竟然开始沉入其中，开始跟着音乐去了解长琴一生所行之事，看到了他已经无法用善恶去分辨的无奈，也能够体会到他平静而终的心情。</p>
<p>我想，这才是美吧。这才是我的存在。我开始认真去想尼采的那句话：人们从事物中发现的东西，是人们预先塞进事物中去的。</p>
<p>我想，在这个技术与资本的时代中，我一定要开始慢下来，放空，去做一些更加重要的事情。</p>
<p>——2016年11月30日上午12：18</p>
<hr>
<p>今天的空，是放下。</p>
<p>从持续了一个周的虚无中走出来，我花了比之前更大的气力。</p>
<p>“虚无”看起来和“空”很像，不过更像它的，是“自由”二字。准确的说，是自由带来了一次又一次的虚无。</p>
<p>所以我说：“一味追求自由，必将陷入虚无之中；而在重重制约下的，才是伟大的存在。”</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/11/24/trashed/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/11/24/trashed/" itemprop="url">
                  开源创客入门可用的资源
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-11-24 21:06:37" itemprop="dateCreated datePublished" datetime="2016-11-24T21:06:37+08:00">2016-11-24</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/创客/" itemprop="url" rel="index"><span itemprop="name">创客</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="开源硬件相关资源"><a href="#开源硬件相关资源" class="headerlink" title="开源硬件相关资源"></a>开源硬件相关资源</h2><p>Microduino WIKI：<a href="https://wiki.microduino.cn/index.php" target="_blank" rel="noopener">https://wiki.microduino.cn/index.php</a> 极客工坊：<a href="http://www.geek-workshop.com/forum.php" target="_blank" rel="noopener">http://www.geek-workshop.com/forum.php</a> Arduino 中文社区：<a href="http://www.arduino.cn/" target="_blank" rel="noopener">http://www.arduino.cn/</a></p>
<h2 id="开源Web相关资源"><a href="#开源Web相关资源" class="headerlink" title="开源Web相关资源"></a>开源Web相关资源</h2><p>w3school 在线教程：<a href="http://www.w3school.com.cn/" target="_blank" rel="noopener">http://www.w3school.com.cn/</a> 廖雪峰官方网站：<a href="http://www.liaoxuefeng.com/" target="_blank" rel="noopener">http://www.liaoxuefeng.com/</a> 慕课网：<a href="http://www.imooc.com/" target="_blank" rel="noopener">http://www.imooc.com</a></p>
<h2 id="人工智能相关资源"><a href="#人工智能相关资源" class="headerlink" title="人工智能相关资源"></a>人工智能相关资源</h2><p>微软认知服务：<a href="https://www.azure.cn/cognitive-services/" target="_blank" rel="noopener">https://www.azure.cn/cognitive-services/</a> 微软 Bot Framework：<a href="https://docs.botframework.com/en-us/" target="_blank" rel="noopener">https://docs.botframework.com/en-us/</a></p>
<h2 id="其他资源"><a href="#其他资源" class="headerlink" title="其他资源"></a>其他资源</h2><p>GitHub：<a href="https://www.github.com/" target="_blank" rel="noopener">https://www.github.com/</a> 知乎：<a href="https://www.zhihu.com/" target="_blank" rel="noopener">https://www.zhihu.com/</a> 百度脑图：<a href="http://naotu.baidu.com/" target="_blank" rel="noopener">http://naotu.baidu.com/</a> 如果其他资源推荐，请在评论中补充。</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/11/19/e9-85-8d-e7-bd-aep4-e7-9a-84int-e5-ba-94-e7-94-a8/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/11/19/e9-85-8d-e7-bd-aep4-e7-9a-84int-e5-ba-94-e7-94-a8/" itemprop="url">
                  配置P4的INT应用
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-11-19 22:05:51" itemprop="dateCreated datePublished" datetime="2016-11-19T22:05:51+08:00">2016-11-19</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/INT/" itemprop="url" rel="index"><span itemprop="name">INT</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/INT/P4/" itemprop="url" rel="index"><span itemprop="name">P4</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p><a href="http://blog.zhengzi.me/578.html">上一篇文章</a>已经把P4的环境在Ubuntu14.04中跑起来了，这里开始尝试在P4环境中配置INT(Inband Network Telemetry)应用。</p>
<h2 id="升级linux-kernel到3-19版本"><a href="#升级linux-kernel到3-19版本" class="headerlink" title="升级linux kernel到3.19版本"></a>升级linux kernel到3.19版本</h2><p>sudo apt-get install linux-generic-lts-vivid</p>
<h2 id="安装Docker"><a href="#安装Docker" class="headerlink" title="安装Docker"></a>安装Docker</h2><p>按照Docker官网上的说明安装即可：<a href="https://docs.docker.com/engine/installation/linux/ubuntulinux/" target="_blank" rel="noopener">https://docs.docker.com/engine/installation/linux/ubuntulinux/</a></p>
<h2 id="顺手再安几个其他的依赖项"><a href="#顺手再安几个其他的依赖项" class="headerlink" title="顺手再安几个其他的依赖项"></a>顺手再安几个其他的依赖项</h2><p>sudo apt-get install python3<br>sudo apt-get install python3-pip<br>sudo apt-get install bridge-utils<br>sudo pip3 install scapy-python3<br>sudo pip3 install websockets</p>
<h2 id="建立Switch的Docker镜像"><a href="#建立Switch的Docker镜像" class="headerlink" title="建立Switch的Docker镜像"></a>建立Switch的Docker镜像</h2><p>cd ~/p4/p4factory/targets/switch/<br>sudo make docker-image</p>
<p>嗯，根据我双核CPU，3.75GB内存的表现，现在可以泡一壶茶，然后再约几个朋友，打几圈麻将。 然而，并没有编译成功。。。（所以明天再说</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/11/19/p4-e8-af-ad-e8-a8-80-e7-8e-af-e5-a2-83-e5-bf-ab-e9-80-9f-e5-ae-89-e8-a3-85-e9-85-8d-e7-bd-ae/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/11/19/p4-e8-af-ad-e8-a8-80-e7-8e-af-e5-a2-83-e5-bf-ab-e9-80-9f-e5-ae-89-e8-a3-85-e9-85-8d-e7-bd-ae/" itemprop="url">
                  P4语言环境快速安装配置
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-11-19 16:20:32" itemprop="dateCreated datePublished" datetime="2016-11-19T16:20:32+08:00">2016-11-19</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/P4/" itemprop="url" rel="index"><span itemprop="name">P4</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/P4/SDN/" itemprop="url" rel="index"><span itemprop="name">SDN</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><p>观察发现，网上有关于P4环境的搭建都是在Ubuntu中进行的，所以我这次也准备从众，使用Ubuntu系统对P4语言的环境进行安装配置。 本来是准备在之前安好Ubuntu的ChromeBook中进行这次实验，但是由于最近国内长城城墙突然变高，GitHub连接速度非常慢，而且容易超时，所以我在这里开了一台国际版azure虚拟机作为实验之用，如果是在国内使用，推荐挂载VPN或者SS之类的socket5代理进行操作。 我选择了Ubuntu14.04作为安装的系统环境。在安装之前，需要先下载P4的源码，这里直接使用p4factory，而不是去分别安装每一个模块。</p>
<h2 id="下载P4factory"><a href="#下载P4factory" class="headerlink" title="下载P4factory"></a>下载P4factory</h2><p>p4factory的Github地址：<a href="https://github.com/p4lang/p4factory" target="_blank" rel="noopener">https://github.com/p4lang/p4factory</a> 在Ubuntu中直接使用git工具clone仓库即可。</p>
<p>mkdir ~/p4<br>cd ~/p4<br>git clone <a href="https://github.com/p4lang/p4factory.git" target="_blank" rel="noopener">https://github.com/p4lang/p4factory.git</a><br>cd p4factory</p>
<h2 id="安装-升级依赖模块"><a href="#安装-升级依赖模块" class="headerlink" title="安装/升级依赖模块"></a>安装/升级依赖模块</h2><p>p4运行环境需要依赖许多其他github上的模块，在官方的Readme中，推荐使用git submodule update将子模块升级到最新版，但是在升级某些项目的时候会被github禁止。解决的方法很简单，生成SSH key，并且添加到Github中即可。</p>
<h3 id="生成SSH-key"><a href="#生成SSH-key" class="headerlink" title="生成SSH key"></a>生成SSH key</h3><p>设置git的username和password：</p>
<p>git config –global user.name “JasonBian”<br>git config –global user.email “<a href="mailto:Jason@xxx.com" target="_blank" rel="noopener">Jason@xxx.com</a>“</p>
<p>进入目录查看是否已经有ssh key</p>
<p>cd ~/.ssh</p>
<p>如果有的话就备份一下然后删除，没有的话就不用去管。 接着就是生成ssh key</p>
<p>ssh-keygen -t rsa -C “<a href="mailto:jason@xxx.com" target="_blank" rel="noopener">jason@xxx.com</a>“</p>
<p>连续按三次回车，生成成功！然后可以在.ssh目录看见两个文件：id_rsa和id_rsa.pub，其中id_rsa是私钥，由自己保存，id_rsa.pub是公钥，需要放在Github中去。 然后，把id_rsa.pub中的内容拷贝到Github中： 登陆Github，点击头像进入Settings，找到SSH and GPG keys，点击new SSH key，随便起一个title，然后</p>
<p>cat id_rsa.pub</p>
<p>将输出内容复制到key的输入框中Add即可（此时github需要你再次输入密码，并且添加成功之后会有邮件通知）。 最后，测试一下有没有安装成功~</p>
<p>$ssh <a href="mailto:git@github.com" target="_blank" rel="noopener">git@github.com</a><br>The authenticity of host ‘github.com (192.30.253.113)’ can’t be established.<br>RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.<br>Are you sure you want to continue connecting (yes/no)? yes<br>Warning: Permanently added ‘github.com,192.30.253.113’ (RSA) to the list of known hosts.<br>PTY allocation request failed on channel 0<br>Hi imaginezz! You’ve successfully authenticated, but GitHub does not provide shell access.<br>Connection to github.com closed.</p>
<p>出现上述提示说明已经安装成功。另外，也可以看见github中刚刚添加的sshkey变成了绿色。</p>
<h3 id="继续升级依赖模块"><a href="#继续升级依赖模块" class="headerlink" title="继续升级依赖模块"></a>继续升级依赖模块</h3><p>添加完ssh key以后，就可以放心升级依赖模块啦。</p>
<p>cd ~/p4/p4factory<br>git submodule update –init –recursive</p>
<h2 id="安装环境依赖"><a href="#安装环境依赖" class="headerlink" title="安装环境依赖"></a>安装环境依赖</h2><p>p4的源码非常复杂，主要由python和c++开发，所以环境依赖就更是复杂。好在官方提供了install_deps.sh脚本，可以一键安装所有的环境依赖。执行方式很简单：</p>
<p>sudo ./install_deps.sh</p>
<p>接下来，脚本就会自动使用apt和pip安装所需要的依赖包，并且也会对一些依赖包进行编译安装。这个时间可以刚好去泡一壶茶。 不过我在安装thrif的时候出现了编译错误，大体上错误提示是：thrift ‘SSLv3_method’ was not declared in this scope。我Google了一下，发现了一些解决方法。具体可以参考Github中这个issue：<a href="https://github.com/ptrkrysik/gr-gsm/issues/155" target="_blank" rel="noopener">https://github.com/ptrkrysik/gr-gsm/issues/155</a>。 放在现在的环境中，在出现错误退出以后，会多一个install_temp的目录，先别急着删除，进入thrift的文件中</p>
<p>sudo vim install_tmp/thrift-0.9.2/lib/cpp/src/thrift/transport/TSSLSocket.cpp</p>
<p>搜索</p>
<p>ctx_ = SSL_CTX_new(SSLv3_method())</p>
<p>并改为</p>
<p>ctx_ = SSL_CTX_new(SSLv23_method())</p>
<p>然后退回p4factory文件夹，修改 install_deps.sh文件。</p>
<p>cd -<br>sudo vim install_deps.sh</p>
<p>做如下修改：</p>
<p>69行<br>mkdir install_tmp<br>修改为</p>
<p>#mkdir install_tmp</p>
<p>76行<br>cd test/cpp ;ln -s . .libs ; cd ../..<br>修改为<br>test/cpp ;</p>
<p>#ln -s . .libs ;<br>cd ../..</p>
<p>然后执行</p>
<p>sudo ./install_deps.sh</p>
<p>重新安装环境依赖，这时候应该就可以正常跑完了。 最后，安装veth（虚拟以太网）接口</p>
<p>sudo ./tools/veth_setup.sh</p>
<h2 id="进行编译"><a href="#进行编译" class="headerlink" title="进行编译"></a>进行编译</h2><p>sudo ./autogen.sh<br>sudo ./configure</p>
<p>编译过程没出现什么问题，现在应该已经可以正常使用整个环境了。</p>
<h2 id="测试basic-routing"><a href="#测试basic-routing" class="headerlink" title="测试basic_routing"></a>测试basic_routing</h2><p>安装完成以后可以跑一段官方demo验证是否可以跑起来。跟着文档走，选择测试basic_routing。 首先对P4工程进行编译，然后运行bm</p>
<p>cd p4factory/targets/basic_routing/<br>sudo make bm<br>sudo ./behavioral-model</p>
<p>紧接着，打开另一个终端，进入basic_routing文件夹</p>
<p>cd ~/p4/p4factory/targets/basic_routing/<br>sudo python run_tests.py –test-dir tests/ptf-tests/</p>
<p>当测试代码运行完成以后，可以看见之前启动bm的终端已经显示了在发包时候的具体操作，说明P4已经可以正常运行了。</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/11/18/e8-ae-b0-e5-9c-a8chromebook-e4-b8-ad-e8-a3-85-e5-85-a5ubuntu/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/11/18/e8-ae-b0-e5-9c-a8chromebook-e4-b8-ad-e8-a3-85-e5-85-a5ubuntu/" itemprop="url">
                  记在ChromeBook中装入Ubuntu
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-11-18 18:08:46" itemprop="dateCreated datePublished" datetime="2016-11-18T18:08:46+08:00">2016-11-18</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Linux/" itemprop="url" rel="index"><span itemprop="name">Linux</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>前一阵升级了Windows10周年更新以后发现系统内自带了一个Ubuntu的Bash，想去跑一些东西试试，结果令我失望。比如一些网络的命令没法正常使用，而且jdk似乎跑起来也有问题，后台服务也很奇怪（貌似把shell关掉以后就自己停止），所以种种原因让我不得不试着用别的办法来干活儿。 于是，从师兄那里拿到了一个HP的ChromeBook14，长的挺漂亮，性能也还不错——CPU是赛扬双核，4G内存，16G的SSD（之后证明这么小的硬盘的确不够用）。所以准备把它的ChromeOS改装成Ubuntu。查了一下，网上也有挺多资料。</p>
<h2 id="方案1"><a href="#方案1" class="headerlink" title="方案1"></a>方案1</h2><p>这个方案是利用ChromeBook中的crouton进行安装Ubuntu。基本原理可以参考<a href="https://github.com/dnschneid/crouton" target="_blank" rel="noopener">crouton在github中的readme</a>。 首先，在ChromeBook中开启开发者模式。【注意：这个操作会清理掉所有数据】</p>
<ul>
<li>按住 Esc+F3 (Refresh)，然后按 Power，接着就会进入恢复模式;</li>
<li>接着，按 Ctrl+D，它会提示您是否取消Verification，按Enter，关闭verification</li>
<li>接着，Esc+F3 (Refresh)，然后按 Power，重启</li>
<li>接着按Ctrl+D， 提示是否进入开发者模式，您的数据会被清除;</li>
<li>再次按 Ctrl+D，或者等待 30 秒左右，系统会引导您进入开发者模式。</li>
<li>漫长的等待。</li>
</ul>
<p>打开以后就可以去安装crouton了。但是这里遇到了一个问题，就是任何操作都需要翻墙，在ChromeOS中因为都是在浏览器的基础上的设置，所以基本都可以使用SS作Socket5代理，但是一旦进入命令行模式，这些代理可能都将会失效，导致无法下载系统镜像。所以，在我只有SS代理的情况下，这个方案最终失败。 如果有办法翻越长城，可以使用个方案让ChromeOS和Ubuntu都存在。 之后的具体步骤可以参考：</p>
<ul>
<li><p>ChromeBook 折腾小记：<a href="https://www.zybuluo.com/chopsticks/note/68204" target="_blank" rel="noopener">https://www.zybuluo.com/chopsticks/note/68204</a></p>
</li>
<li><p>How to install ubuntu and minrcraft on chomebook：<a href="http://www.everydaylinuxuser.com/2014/03/how-to-install-ubuntu-and-minecraft-on.html" target="_blank" rel="noopener">http://www.everydaylinuxuser.com/2014/03/how-to-install-ubuntu-and-minecraft-on.html</a></p>
</li>
<li><p>ChromeBook玩机汇总：<a href="https://tieba.baidu.com/p/3507150438" target="_blank" rel="noopener">https://tieba.baidu.com/p/3507150438</a></p>
</li>
</ul>
<h2 id="方案2"><a href="#方案2" class="headerlink" title="方案2"></a>方案2</h2><p>由于网络问题，我决定干掉原生的ChromeOS，直接安装Ubuntu。方法很简单，使用上一种方法中的办法开启开发者模式。 接着在开机时候会提示系统认证错误，然后按【Ctrl+L】进入seaBios，这时候会发现ChromeBook已经和一台普通PC没有任何区别了。 现在，在其他电脑上准备一个Ubuntu镜像并且制作一个启动U盘（怎么做这里就不多说了）。 然后在启动之前插入U盘，进入警告画面的时候按Ctl+L进入SeaBios，然后按照提示引导U盘（应该默认也会引导），接着按照正常的办法安装Ubuntu即可。注意在分区的时候直接删除掉ChromeOS的分区。 我这里使用的版本是Ubuntu 16.04 LTS，屏幕亮度调节、WiFi、声音等一切驱动都正常，键盘上的功能按键也可以正常使用，除了触控板不是很灵敏，现在还没有找到解决方法，可以先用外接鼠标替代。 PS：启动以后可能会提示系统错误，不必管它，正常使用即可。 最后，晒一张安装成功的图片~ <a href="http://blog.zhengzi.me/wp-content/uploads/2016/11/660408137320180608.jpg"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/11/660408137320180608-1024x768.jpg" alt="660408137320180608"></a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/10/31/e8-ae-b0-e4-b8-80-e6-ac-a1office-e4-b8-bb-e9-a2-98-e7-9a-84hackathon/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/10/31/e8-ae-b0-e4-b8-80-e6-ac-a1office-e4-b8-bb-e9-a2-98-e7-9a-84hackathon/" itemprop="url">
                  记DevDays Asia 2016 @Beijing
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-10-31 00:39:31" itemprop="dateCreated datePublished" datetime="2016-10-31T00:39:31+08:00">2016-10-31</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Office/" itemprop="url" rel="index"><span itemprop="name">Office</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Office/应用/" itemprop="url" rel="index"><span itemprop="name">应用</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>作为一个参加了许多次Hackathon的老司机，恰巧见到微软的Office主题Hackathon，想去凑凑热闹。没想到这成了我到目前参与过的逼格最高也是感悟最多的一次Hackathon。 <a href="http://blog.zhengzi.me/wp-content/uploads/2016/10/163668315694259371.jpg"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/10/163668315694259371-1024x768.jpg" alt="163668315694259371"></a>话不多说，先放出我们的作品：一款PowerPoint插件——ClassPie。总的来说，ClassPie是一款可以帮助老师在课堂中更加高效地同学生互动的PowerPoint插件。可以把每一页Slide中的题目直接分发给在课堂中或者远程听课的同学，同时实时搜集同学们的答案并汇总到PPT中；同学们也可以把不懂的问题直接通过弹幕的形式发送到PPT中（在这里调用了以前的项目<a href="http://blog.zhengzi.me/319.html">DanmakuPie</a>的API）直接同老师互动。  <a href="http://blog.zhengzi.me/wp-content/uploads/2016/10/527513761386604399.jpg"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/10/527513761386604399-768x1024.jpg" alt="527513761386604399"></a> 半成品的Github链接：<a href="https://github.com/Thesharing/ClassPieAddin" target="_blank" rel="noopener">https://github.com/Thesharing/ClassPieAddin</a>。 说完作品，我更多想来谈谈这两天在微软的感受。 作为微软最有钱任性的Office部门，到来的讲师也都非常厉害。他们由来自Redmond和上海的大佬组成，阵容豪华。更重要的是多数讲师都非常Nice，帮助了我们许多。 在Kickoff结束以后，我们团队开始讨论这次要做的主题，这时一位美籍华人Donny主动来到我们这边参与讨论中，虽然他的中文不是很好，但还是坚持用中文和我们来聊想法和思路，并且跟许多同事求证我们所想要的效果在新的add-in技术中是否具有解决方案。虽然最终结果是不可行的，但他的鼓励给了我们很强的动力去用各种办法来达到我们想要的效果。 <img src="http://blog.zhengzi.me/wp-content/uploads/2016/11/9381fac5e60bb04a59262138f3453de6.jpg" alt=""> 之后在两天的开发中，一位印度小哥Tarun更是帮助了我们许多。在我们确定许多方案不可行之后一筹莫展的时候又是他主动凑过来询问项目进展（这也终于使我达成了听懂印式英语的成就，交流上的困难也并没有构成多大的障碍，我们很快可以自由地表达各自的想法）。在听完我们的困惑以后他给出了VSTO的方案并让我们尝试，之后向我要了电子邮箱，给我发了好几封相关的文档或者教程。这对我们帮助很大。不仅仅如此，第二天一大早，他主动打招呼问我们问题解决得怎么样，我们如实说还是有一些关于WinForms的小问题。没先到他就真的拿来自己的电脑打开Visual Studio按照我们的说法和一些Sample敲了一遍，接着去Debug，然后搜索出现的问题，并叫来另一位大神一起讨论，找到了解决方案，并且耐心讲给我们。更令我们惊讶的是，在他走后一阵又主动跑来告诉我们旁边会场的下一个主讲人可能会讲到我们遇到的问题，强烈建议我们去听一下。 <img src="http://blog.zhengzi.me/wp-content/uploads/2016/11/045f7157652bd1cf83b29c02daebdd8f.jpg" alt=""> 嗯，终于，经过这两位工程师的帮助，我们居然还算顺利地完成了预想的所有功能，在这儿给他们点一个大大的赞。 我想他们一定是非常热爱自己的工作，不然是不可能每天以如此充沛的精力投入到问题的解决中。他们也可以利用各种可以利用的方法去思考解决问题，甚至愿意自己亲手去写代码（我的感觉里级别这么高的人不可能会亲自写代码），更愿意很热心毫无怨言帮助像我们这样如此小白的学生。嗯，以后，一定要和这样一群优秀的人共事。 伙食住宿方面，也都非常周到。 <img src="http://blog.zhengzi.me/wp-content/uploads/2016/11/20fe814c659cc97a2edca582cbfb5db7.jpg" alt=""> 第一天晚上的自助非常给力，忍不住多吃了些。之后早饭都是麦当劳，午饭是盒饭，另外还有一顿pizza。值得一提的是微软并没有因为有这么多外国人就多准备西餐（不过还是多准备了勺子），在我们嫌弃盒饭的时候，眼看着那些来自国外的大牛们直冲冲拿起一盒走去桌子边上就开吃，毫无违和感。而在吃Pizza的时候他们来晚了，也好不嫌弃看见哪桌还有pizza抓起来就开吃。另外，组委会也贴心地准备了怎么也吃不完的零食和水果，还有泡面 ！这也导致我两天后腰带都必须得松上一圈。 住宿方面除了不能洗澡剩下我都非常喜欢。组委会准备了许多睡垫、毛巾毯和洗漱包。在微软大厦温暖的空调和柔软的地板上睡了两晚也是别有滋味。 作品评比方面也还不错，抛弃了往常的PosterSession和主题路演，而是采用了现由评委去每一个团队的位子上来观看团队展示，之后晋级的团队再去做主题演讲的形式（还贴心地请了一位超级厉害的美女同传）。过程比较随意，但也不会感到无聊。 <img src="http://blog.zhengzi.me/wp-content/uploads/2016/11/1493f428f1a1dd3337730108598b3052.jpg" alt=""> （PS：两天里真的是受够了用蹩脚的英语同歪果仁交流的感觉，好羡慕英语好能够和老外轻松愉快地交流的同学T-T，此贴长期招英语好的妹纸求带飞。） 有趣的是和我们一起组队的一位神奇的大叔这时候仿佛开了天眼，在初赛我们表现不佳的时候鼓励我们说“我们一定可以进入复赛”，结果如他所料，而在复赛还没开始的时候又转了一圈回来说“我们这次应该是第三名”，果不其然又如他所料。 第一名是几位法律人士做的一个Word法律助手，可以快速更正错误用法，也可以快速插入各种法条模板，非常贴切需求，给我留了非常深刻的印象。像他们这样可以在工作中发现刚性需求，然后用技术去解决的，必然冠军无疑。 最终的奖品是团队里每个人一人一台九号平衡车，第一次拿到奖品难免有些激动，于是又和志龙奖励给自己一顿好吃的春卷。 <img src="http://blog.zhengzi.me/wp-content/uploads/2016/11/4119d4456c31676ae552545f8e52f98e.jpg" alt=""> 两天的Hackathon结束，但ClassPie并没有结束。我们还是想把这个项目继续做下去。也希望有兴趣来改变课堂教学现状的同学加入我们，一起为学弟学妹做一些有意思的事情！ <a href="http://blog.zhengzi.me/wp-content/uploads/2016/10/微信截图_20161107012941.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/10/微信截图_20161107012941-1024x771.png" alt="%e5%be%ae%e4%bf%a1%e6%88%aa%e5%9b%be_20161107012941"></a>最后，附上MSDN的博客链接：<a href="http://blog.sina.com.cn/s/blog_6408cdc70102wyd1.html" target="_blank" rel="noopener">DevDays Asia 2016 精彩回顾</a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/10/05/php-e7-9a-84-post-e5-8f-98-e9-87-8f-e6-b5-85-e6-9e-90/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/10/05/php-e7-9a-84-post-e5-8f-98-e9-87-8f-e6-b5-85-e6-9e-90/" itemprop="url">
                  PHP的$_POST变量浅析
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-10-05 17:30:35" itemprop="dateCreated datePublished" datetime="2016-10-05T17:30:35+08:00">2016-10-05</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/PHP/" itemprop="url" rel="index"><span itemprop="name">PHP</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>在通常情况下，使用PHP的超级全局变量$_POST来接收使用HTTP POST方法提交的信息。但是在某些情况下，似乎$_POST并不能获得前端使用HTTP POST方法发来的数据。 查找资料后发现$_POST的确有使用局限，它只能接受HTTP头中文档类型为表单传来的数据，即Content-Type: application/x-www-form-urlencoded 具体可以参见PHP官方文档：<a href="http://php.net/manual/en/reserved.variables.post.php#114598" target="_blank" rel="noopener">http://php.net/manual/en/reserved.variables.post.php#114598</a> 在使用jQuery的时候，jQuery的POST方法总是会自动设置Content-Type为application/x-www-form-urlencoded，但是在使用AngularJS框架的时候，发现Content-Type被设置成了application/json，这样使用PHP的$_POST就不能直接获取到提交的信息了。 解决方法：</p>
<ol>
<li>修改AngularJS发送的POST请求时的HTTP头具体方法可以参考官方文档：<a href="https://docs.angularjs.org/api/ng/service/$http#post" target="_blank" rel="noopener">https://docs.angularjs.org/api/ng/service/$http#post</a>，建议直接修改httpProvider的content-type建议直但是修改成功以后还是不能正常接收，具体原因还要继续检查。</li>
<li>在Angular中的jQLite或者jQuery发送POST请求最直观的解决方法，但是可能会使得代码的可读性变差，而且还需要转换</li>
<li><p>在PHP中使用其他方式接收信息</p>
<ul>
<li>使用$GLOBALS[‘HTTP_RAW_POST_DATA’]方式接收</li>
</ul>
<p>HTTP_RAW_POST_DATA 变量包含有原始的 POST 数据。此变量仅在碰到未识别 MIME 类型的数据时产生，而PHP默认识别的数据类型是application/x-<a href="http://www.form-urlencoded标准的数据类型，所以可以使用HTTP\_RAW\_POST\_DATA来接收数据。" target="_blank" rel="noopener">www.form-urlencoded标准的数据类型，所以可以使用HTTP\_RAW\_POST\_DATA来接收数据。</a></p>
<ul>
<li>使用php://input方式接收数据</li>
</ul>
<p>php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下，最好使用 php://input 来代替 $HTTP_RAW_POST_DATA，因为它不依赖于特定的 php.ini 指令。 而且，这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充， 比激活 always_populate_raw_post_data 潜在需要更少的内存。</p>
<p>//具体用法很简单<br>$input = file_get_contents(‘php://input’);</p>
<p>具体可以参考官方文档：<a href="http://php.net/manual/zh/wrappers.php.php#wrappers.php.input" target="_blank" rel="noopener">http://php.net/manual/zh/wrappers.php.php#wrappers.php.input</a></p>
</li>
</ol>
<p>参考文档：<a href="http://www.jb51.net/article/67296.htm" target="_blank" rel="noopener">http://www.jb51.net/article/67296.htm</a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/10/04/e7-a7-8b-e5-a4-a9-e8-92-99-e5-a4-aa-e5-a5-87/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/10/04/e7-a7-8b-e5-a4-a9-e8-92-99-e5-a4-aa-e5-a5-87/" itemprop="url">
                  秋天蒙太奇
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-10-04 00:24:50" itemprop="dateCreated datePublished" datetime="2016-10-04T00:24:50+08:00">2016-10-04</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/随笔/" itemprop="url" rel="index"><span itemprop="name">随笔</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p><a href="http://music.163.com/#/song?id=28068839" target="_blank" rel="noopener">http://music.163.com/#/song?id=28068839</a> 秋天里，起风了。风声如电影一样，一帧一帧地走来，又一帧一帧地离开。 五月天是彩色的八月底。和乃凡去赶了个大早却没赶上开场。于是有了第一次在大半个鸟巢里像个运动员一样左右狂奔。结果是在“Do you every shine”里被打了鸡血，得到了Live鸟巢奔跑的Buff。 耳朵逐渐适应被灌入反响后，也忍不住去回想。两年前在首体，第一次听演唱会，买不起前排，却忘记戴眼镜。陈老师在眼前却怎么也看不清楚。那时候听五月天似乎比陈绮贞更多一些，有意思的事如今情况却是倒转了。不变的呢，是对阿信和陈老师同台再唱《私奔到月球》的憧憬。话说那时还傻傻期待他俩可以在一起呢。 <img src="http://blog.zhengzi.me/wp-content/uploads/2016/10/6d888c37673346e03f0ed54ad4497efa.jpg" alt="">  <a href="http://blog.zhengzi.me/wp-content/uploads/2016/10/531425204057462844.jpg"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/10/531425204057462844.jpg" alt="531425204057462844"></a><img src="http://blog.zhengzi.me/wp-content/uploads/2016/10/197204e8c45e4827cb363bd1c3db45b3.jpg" alt="阿丁SH　陈绮贞演唱会　型号 : EOS 5D Mark III 光圈 : f/4.0 曝光时间 : 1/200 ISO : 2000 焦距 : 106mm"> 比起对两位陈老师的喜欢，现实总是多变的。回忆里日子没那么远，可如今你的身边和我的身边，再也不会是同一边。</p>
<hr>
<p>博客更了有一年半的样子了。最近一直在想，为什么想开一个自己的博客，更一篇文章要好几个晚上睡不好觉，甚至没有思绪的时候要强行放空很久才能写出几个字，博客对于我真的有这个必要么？ 最最开始的时候肯定是被策叔博客的高大上逼格征服，心潮澎湃急于做些什么证明自己。于是政子哥哥的博客一个雨后下午在SAE上线——没有固定风格，也不知道发一些什么，对于WP更是晕头转向。又用了半年，终于找到了一些感觉，跟小牛前后买了域名，迁移到阿里云上，并且把空间上的一部分随笔更新到了博客里，顺手把自己配置Linux服务器方面的经验归纳总结成一些简单的教程。没有SEO，也没太多访问量，就是自己在不断更新，断断续续到了现在。 逐渐地，我发现zhengzi.me变成了一个我在偌大的互联网上的一片小小的自留地，在这里可以做很任性的事情，我任意分配二级域名，任意调整端口地址，随心更新博客，几乎不受任何约束和限制，我感到了前所未有的满足，这才是我要的生活。我确信我需要这样自由不约束的环境。 所以我想博客对我来说是很有必要的。以后的文章也要走出是总结、教程、意识流，用更加自由的形式，写出更多想表达出来的内容。 PS：这两天更新了一下友链实现方法，发现很多以前和我交换友链的博友已经404，无奈之下只好将一些链接隐藏。</p>
<hr>
<p>九月是一个急转弯。 到现在我都调侃自己，上个月是不是就是一场梦。保研和找到导师放在我这个学渣的面前十分艰难，没有多位老师和师兄师姐的帮助，我几乎无法喘息，更无法坚持走过来。你们，一切，我都铭记在心。 记得在高考填报志愿结束，和妈妈走在中心街旁的大路上，听到“当天上星河转，我命已定盘”一句，望见漫天星辰，感慨颇深。今感受亦是如此，虽不知前路如何，却也已尘埃落定，只有大步向前。 <a href="http://music.163.com/#/song?id=167691" target="_blank" rel="noopener">http://music.163.com/#/song?id=167691</a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/09/25/e4-bd-bf-e7-94-a8c-e5-b0-81-e8-a3-85-e4-b8-80-e4-b8-aauwp-applicaion-data-e7-9a-84-e7-bb-93-e6-9e-84-e5-8c-96-e5-ad-98-e5-82-a8-e7-b1-bb/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/09/25/e4-bd-bf-e7-94-a8c-e5-b0-81-e8-a3-85-e4-b8-80-e4-b8-aauwp-applicaion-data-e7-9a-84-e7-bb-93-e6-9e-84-e5-8c-96-e5-ad-98-e5-82-a8-e7-b1-bb/" itemprop="url">
                  使用C#封装一个UWP Applicaion Data的结构化存储类
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-09-25 16:58:35" itemprop="dateCreated datePublished" datetime="2016-09-25T16:58:35+08:00">2016-09-25</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C#</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/C/UWP/" itemprop="url" rel="index"><span itemprop="name">UWP</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>在.Net中，Applicaion Data相当于一个结构化存储器，在存储一些配置信息的时候，使用非常方便。在应用更新以后，配置不会丢失，在应用写在以后会自动删除，并且也使用了加密存储，没有安全问题。 这里是关于App Settings的一些特性</p>
<ul>
<li>用来保存配置数据，最深32层，不限数量，可以保存在本地且可以漫游。</li>
<li>　　AppSettings支持除二进制外的所有WinRT数据格式，如果存储二进制数据得用文件。</li>
<li>　　系统只验证数据格式和长度，不验证数据是否正确。</li>
</ul>
<h2 id="主要存储类型"><a href="#主要存储类型" class="headerlink" title="主要存储类型"></a>主要存储类型</h2><p>存储分为本地存储和进行漫游，漫游的话可以在多设备之间同步。 存储分为直接存储、Composite设置集合和Container容器。 其中这些存储类型可以相互嵌套。Container容器类似于一个文件夹可以作为许多设置的抽象集合，而Composite集合类似于一个文件夹，可以将同类的设置放一起，而直接存储可以存储单条信息。 Container中能够包含多个Composite和单条键值对，而Composite中可以包含多条键值对。之后将根据这些不同的存储方法对ApplicationData进行封装。</p>
<h2 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h2><p>代码通过模拟jQuery的连缀操作，可以在单行完成存储复杂类型数据的操作。</p>
<p>using System;<br>using System.Collections.Generic;<br>using Windows.Storage;</p>
<p>class SettingLib {</p>
<pre><code>//声明存储容器
private ApplicationDataContainer dataSettings;

//声明一些临时变量
private string tempSettingName;
private object tempSettingValue;
private string tempContainerName;
private string tempCompositeName;
private ApplicationDataContainer tempContainer;
private ApplicationDataCompositeValue tempComposite;
private ApplicationDataCompositeValue tempReadComposite;

//是否自动清除缓存的变量
private bool isAutoClearTemp;

//构造函数，默认为漫游设置和自动清除历史设置的缓存
public SettingLib(bool isRoaming = true, bool isAutoClearTemp = true) {
    if (isRoaming) {
        dataSettings = ApplicationData.Current.RoamingSettings;
    } else {
        dataSettings = ApplicationData.Current.LocalSettings;
    }
    this.isAutoClearTemp = isAutoClearTemp;
    tempContainer = null;
    tempComposite = null;
    tempReadComposite = null;
}

//创建直接存储,需要传入一个键值对
public SettingLib CreateSetting(string key, object value) {
    tempSettingName = key;
    tempSettingValue = value;
    return this;
}
//创建存储集合，需要传入集合的名称和键值对的List
public SettingLib CreateComposite(string compositeName, List&lt;Tuple&lt;string, object&gt;&gt; vals) {
    ApplicationDataCompositeValue composite = new ApplicationDataCompositeValue();
    foreach (Tuple&lt;string, object&gt; v in vals) {
        composite\[v.Item1\] = v.Item2;
    }
    tempComposite = composite;
    tempCompositeName = compositeName;
    return this;
}
//创建存储容器，需要传入容器的名称
//不考虑嵌套Container
public SettingLib CreateContainer(string containerName) {
    ApplicationDataContainer container = dataSettings.CreateContainer(containerName, ApplicationDataCreateDisposition.Always);
    tempContainer = container;
    tempContainerName = containerName;
    return this;
}

//将之前创建的各种存储类型进行组合之后进行存储
//可以在Container中包含Composite或者键值对，可以在Composite中包含多条键值对，可以直接存储键值对
//不考虑嵌套Container
public SettingLib SaveSetting() {
    if (tempContainer != null) {
        if (dataSettings.Containers.ContainsKey(tempContainerName)) {
            if (tempComposite != null) {
                dataSettings.Containers\[tempContainerName\].Values\[tempCompositeName\] = tempComposite;
            } else {
                dataSettings.Containers\[tempContainerName\].Values\[tempSettingName\] = tempSettingValue;
            }
        } else {
            throw new ArgumentException();
        }
    } else {
        if (tempComposite != null) {
            dataSettings.Values\[tempCompositeName\] = tempComposite;
        } else {
            dataSettings.Values\[tempSettingName\] = tempSettingValue;
        }
    }
    if (isAutoClearTemp) {
        ClearTemp();
    }
    return this;
}

//一次操作后清除缓存的方法
public SettingLib ClearTemp() {
    tempSettingValue = null;
    tempContainer = null;
    tempComposite = null;
    tempReadComposite = null;
    return this;
}
//如果没有设置自动清除缓存的话可以手动清除缓存,需要传入清除缓存的类型
public SettingLib ClearTemp(string content) {
    switch (content) {
        case &quot;Setting&quot;:
            tempSettingValue = null;
            break;
        case &quot;Container&quot;:
            tempContainer = null;
            break;
        case &quot;Composite&quot;:
            tempComposite = null;
            break;
        case &quot;ReadComposite&quot;:
            tempReadComposite = null;
            break;
        default:
            throw new ArgumentException();
    }
    return this;
}

//读取键值对存储
public object ReadSetting(string key) {
    object value = dataSettings.Values\[key\];
    return value;
}

//读取Composite中的所有键值对，并且以List返回
//不考虑嵌套Container
public List&lt;Tuple&lt;string, object&gt;&gt; ReadSetting(string compositeName, List&lt;string&gt; settingNames) {
    ApplicationDataCompositeValue composite;
    if (tempReadComposite != null) {
        composite = tempReadComposite;
    } else {
        composite = (ApplicationDataCompositeValue)ReadSetting(compositeName);
    }
    if (composite == null) {
        return null;
    } else {
        List&lt;Tuple&lt;string, object&gt;&gt; cs = new List&lt;Tuple&lt;string, object&gt;&gt;();
        foreach (string sn in settingNames) {
            cs.Add(new Tuple&lt;string, object&gt;(sn, composite\[sn\]));
        }
        return cs;
    }
}
//读取Container中指定名称的设置
//不考虑嵌套Container
public object ReadSetting(string containerName, string settingName) {
    bool hasContiner = dataSettings.Containers.ContainsKey(containerName);
    bool hasSetting = false;
    object settingValue = null;
    if (hasContiner) {
        hasSetting = dataSettings.Containers\[containerName\].Values.ContainsKey(settingName);
    }
    if (hasSetting) {
        settingValue = dataSettings.Containers\[containerName\].Values\[settingName\];
    }
    return settingValue;
}
//读取Container中设置集合中的所有键值对
public List&lt;Tuple&lt;string, object&gt;&gt; ReadSetting(string containerName, string compositeName, List&lt;string&gt; settingNames) {
    tempReadComposite = (ApplicationDataCompositeValue)ReadSetting(containerName, compositeName);
    List&lt;Tuple&lt;string, object&gt;&gt; ret = ReadSetting(null, settingNames);
    if (isAutoClearTemp) {
        ClearTemp();
    }
    return ret;
}

//删除某种设置
//不考虑嵌套Container
public void RemoveSetting(string settingName, bool isContainer = false) {
    if (isContainer) {
        dataSettings.DeleteContainer(settingName);
    } else {
        dataSettings.Values.Remove(settingName);
    }
}
</code></pre><p>}</p>
<h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>可以使用连缀操作在单行进行复杂的设置</p>
<p>public void makeSettings() {<br>    SettingLib settingLib = new SettingLib();<br>    settingLib.CreateContainer(“CampusNetwork”).CreateSetting(“campusNetworkAccountId”, id).SaveSetting();<br>    string id = (string)settingLib.ReadSetting(“CampusNetwork”, “campusNetworkAccountId”);<br>}</p>
<p>需要注意的点：</p>
<ul>
<li>在存储的时候使用连续的Create创建结构化的存储，最后使用SaveStting方法进行最终存储。</li>
<li>使用ReadSetting读取数据，具体使用可以参考ReadingSetting方法的每一种重载中的注释</li>
<li>在创建结构化存储的时候，可以在Container中包含Composite或者键值对，可以在Composite中包含多条键值对，可以直接存储键值对</li>
</ul>
<h2 id="获取文中代码"><a href="#获取文中代码" class="headerlink" title="获取文中代码"></a>获取文中代码</h2><p>在GitHub的HelloBUPT项目中可以得到代码：<a href="https://github.com/imaginezz/helloBUPT/blob/master/beiyou/CommonLibrary/SettingLib.cs" target="_blank" rel="noopener">https://github.com/imaginezz/helloBUPT/blob/master/beiyou/CommonLibrary/SettingLib.cs</a></p>
<h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>Windows 10 UWP开发：如何读取和保存设置：<a href="http://edi.wang/post/2015/11/20/uwp-read-write-settings?utm_source=tuicool&amp;utm_medium=referral" target="_blank" rel="noopener">http://edi.wang/post/2015/11/20/uwp-read-write-settings?utm_source=tuicool&amp;utm_medium=referral</a></p>
<p>windows 8 开发 Application Data：<a href="http://www.cnblogs.com/icuit/archive/2012/06/06/2538246.html" target="_blank" rel="noopener">http://www.cnblogs.com/icuit/archive/2012/06/06/2538246.html</a> MSDN ApplicationDataContainer Class：<a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.storage.applicationdatacontainer.aspx" target="_blank" rel="noopener">https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.storage.applicationdatacontainer.aspx</a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/09/25/e4-bd-bf-e7-94-a8c-e5-b0-81-e8-a3-85-e4-b8-80-e4-b8-aauwp-e7-9a-84toast-e9-80-9a-e7-9f-a5-e7-b1-bb/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/09/25/e4-bd-bf-e7-94-a8c-e5-b0-81-e8-a3-85-e4-b8-80-e4-b8-aauwp-e7-9a-84toast-e9-80-9a-e7-9f-a5-e7-b1-bb/" itemprop="url">
                  使用C#封装一个UWP的Toast通知类
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-09-25 16:14:38" itemprop="dateCreated datePublished" datetime="2016-09-25T16:14:38+08:00">2016-09-25</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C#</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/C/UWP/" itemprop="url" rel="index"><span itemprop="name">UWP</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>在UWP开发中，可以使用Toast方式直接生成系统通知，并出现在Windows的通知中心中。 Toast通知的核心是一个XML文档，其中包含了通知的图标、文字和式样。系统中提供了该XML文档的模板。 在这里使用了类似于jQuery的连缀操作的形式使用C#封装了一个关于通知的类，不过还不支持win10可交互通知，以后会加入。</p>
<h2 id="模板类型"><a href="#模板类型" class="headerlink" title="模板类型"></a>模板类型</h2><p>消息通知的模板一共有8中，这里有每一种模板的介绍。</p>
<p>//<br>// Summary:<br>//     指定要在消息通知中使用的模版。<br>[ContractVersion(typeof(UniversalApiContract), 65536)]<br>public enum ToastTemplateType<br>{<br>  //<br>  // Summary:<br>  //     在三行文本中被包装的大型图像和单个字符串。<br>  ToastImageAndText01 = 0,<br>  //<br>  // Summary:<br>  //     大图像、加粗文本的一个字符串在第一行、常规文本的一个字符串包装在第二、三行中。<br>  ToastImageAndText02 = 1,<br>  //<br>  // Summary:<br>  //     大图像、加粗文本的一个字符串被包装在开头两行中、常规文本的一个字符串包装在第三行中。<br>  ToastImageAndText03 = 2,<br>  //<br>  // Summary:<br>  //     大图像、加粗文本的一个字符串在第一行、常规文本的一个字符串在第二行中、常规文本的一个字符串在第三行中。<br>  ToastImageAndText04 = 3,<br>  //<br>  // Summary:<br>  //     包装在三行文本中的单个字符串。<br>  ToastText01 = 4,<br>  //<br>  // Summary:<br>  //     第一行中加粗文本的一个字符串、覆盖第二行和第三行的常规文本的一个字符串。<br>  ToastText02 = 5,<br>  //<br>  // Summary:<br>  //     覆盖第一行和第二行的加粗文本的一个字符串。第三行中常规文本的一个字符串。<br>  ToastText03 = 6,<br>  //<br>  // Summary:<br>  //     第一行中加粗文本的一个字符串、第二行中常规文本的一个字符串、第三行中常规文本的一个字符串。<br>  ToastText04 = 7<br>}</p>
<p>以下是每一种通知的XML模板内容</p>
<p>//类型0</p>
<toast><br>    <visual><br>        <binding template="ToastImageAndText01"><br>            <image id="1" src=""><br>            <text id="1"></text><br>        </image></binding><br>    </visual><br></toast><br>//类型1<br><toast><br>    <visual><br>        <binding template="ToastImageAndText02"><br>            <image id="1" src=""><br>            <text id="1"></text><br>            <text id="2"></text><br>        </image></binding><br>    </visual><br></toast><br>//类型2<br><toast><br>    <visual><br>        <binding template="ToastImageAndText03"><br>            <image id="1" src=""><br>            <text id="1"></text><br>            <text id="2"></text><br>        </image></binding><br>    </visual><br></toast><br>//类型3<br><toast><br>    <visual><br>        <binding template="ToastImageAndText04"><br>            <image id="1" src=""><br>            <text id="1"></text><br>            <text id="2"></text><br>            <text id="3"></text><br>        </image></binding><br>    </visual><br></toast><br>//类型4<br><toast><br>    <visual><br>        <binding template="ToastText01"><br>            <text id="1"></text><br>        </binding><br>    </visual><br></toast><br>//类型5<br><toast><br>    <visual><br>        <binding template="ToastText02"><br>            <text id="1"></text><br>            <text id="2"></text><br>        </binding><br>    </visual><br></toast><br>//类型6<br><toast><br>    <visual><br>        <binding template="ToastText03"><br>            <text id="1"></text><br>            <text id="2"></text><br>        </binding><br>    </visual><br></toast><br>//类型7<br><toast><br>    <visual><br>        <binding template="ToastText04"><br>            <text id="1"></text><br>            <text id="2"></text><br>            <text id="3"></text><br>        </binding><br>    </visual><br></toast>

<h2 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h2><p>using System;<br>using System.Collections.Generic;<br>using Windows.Data.Xml.Dom;<br>using Windows.UI.Notifications;</p>
<p>class ToastLib {</p>
<pre><code>//定义通知模板和XML节点
private ToastTemplateType toastTemplate;
private XmlDocument toastXml;
private IXmlNode toastNode;
private XmlNodeList toastTextElements;
private XmlNodeList toastImageAttributes;

//消息类型
private int toastType;
private int ToastType {
    set {
        if (value &gt;= 0 &amp;&amp; value &lt;= 7) {
            toastType = value;
        } else {
            throw new ArgumentOutOfRangeException();
        }
    }
    get {
        return toastType;
    }
}

//构造函数，传入通知模板种类即可
public ToastLib(int type = 0) {
    ToastType = type;
    toastTemplate = (ToastTemplateType)ToastType;
    toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
    toastTextElements = toastXml.GetElementsByTagName(&quot;text&quot;);
    toastImageAttributes = toastXml.GetElementsByTagName(&quot;image&quot;);
}

//生成通知XML的关键函数，用于传入通知图片的连接和通知文字的内容
//传入字符串sample &quot;消息内容&quot; or $&quot;ms-appx:///assets/图片文件名&quot;
public ToastLib makeToast(List&lt;string&gt; toastPara) {
    int\[\] toastParaNumArr = { 2, 3, 3, 4, 1, 2, 2, 3 };
    if (toastPara.Count == toastParaNumArr\[ToastType\]) {
        switch (ToastType) {
            case 0:
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[0\]));
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;src&quot;, toastPara\[1\]);
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;alt&quot;, &quot;logo&quot;);
                break;
            case 1:
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;src&quot;, toastPara\[0\]);
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;alt&quot;, &quot;logo&quot;);
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[1\]));
                toastTextElements\[1\].AppendChild(toastXml.CreateTextNode(toastPara\[2\]));
                break;
            case 2:
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;src&quot;, toastPara\[0\]);
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;alt&quot;, &quot;logo&quot;);
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[1\]));
                toastTextElements\[1\].AppendChild(toastXml.CreateTextNode(toastPara\[2\]));
                break;
            case 3:
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;src&quot;, toastPara\[0\]);
                ((XmlElement)toastImageAttributes\[0\]).SetAttribute(&quot;alt&quot;, &quot;logo&quot;);
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[1\]));
                toastTextElements\[1\].AppendChild(toastXml.CreateTextNode(toastPara\[2\]));
                toastTextElements\[2\].AppendChild(toastXml.CreateTextNode(toastPara\[3\]));
                break;
            case 4:
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[0\]));
                break;
            case 5:
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[0\]));
                toastTextElements\[1\].AppendChild(toastXml.CreateTextNode(toastPara\[1\]));
                break;
            case 6:
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[0\]));
                toastTextElements\[1\].AppendChild(toastXml.CreateTextNode(toastPara\[1\]));
                break;
            case 7:
                toastTextElements\[0\].AppendChild(toastXml.CreateTextNode(toastPara\[0\]));
                toastTextElements\[1\].AppendChild(toastXml.CreateTextNode(toastPara\[1\]));
                toastTextElements\[2\].AppendChild(toastXml.CreateTextNode(toastPara\[2\]));
                break;
        }
    } else {
        throw new ArgumentException();
    }
    return this;
}

//加入点按通知进入App以后向App传入的参数
//para example &quot;{\\&quot;type\\&quot;:\\&quot;toast\\&quot;,\\&quot;param1\\&quot;:\\&quot;12345\\&quot;,\\&quot;param2\\&quot;:\\&quot;67890\\&quot;}&quot;
public ToastLib addToastLaunchPara(string launchPara) {
    ((XmlElement)toastNode).SetAttribute(&quot;launch&quot;, launchPara);
    return this;
}

//改变通知的声音
//the avaliable tones are here:Default,IM,Mail,Reminder,SMS,Looping.Alarm,Looping.Alarm2,Looping.Alarm3,Looping.Alarm4,Looping.Alarm5,Looping.Alarm6,Looping.Alarm7,Looping.Alarm8,Looping.Alarm9,Looping.Alarm10,Looping.Call,Looping.Call2,Looping.Call3,Looping.Call4,Looping.Call5,Looping.Call6,Looping.Call7,Looping.Call8,Looping.Call9,Looping.Call10
public ToastLib setToastTone(string tone) {
    XmlElement audio = toastXml.CreateElement(&quot;audio&quot;);
    audio.SetAttribute(&quot;src&quot;, $&quot;ms-winsoundevent:Notification.&quot; + tone);
    toastNode.AppendChild(audio);
    return this;
}

//改变通知的时长
//only 2 types of paras short or long
public ToastLib setToastDuringTime(string duringTime) {
    ((XmlElement)toastNode).SetAttribute(&quot;duration&quot;, duringTime);
    return this;
}

//显示通知
public void showToast() {
    ToastNotification toast = new ToastNotification(toastXml);
    ToastNotificationManager.CreateToastNotifier().Show(toast);
}
</code></pre><p>}</p>
<h2 id="使用方式"><a href="#使用方式" class="headerlink" title="使用方式"></a>使用方式</h2><p>使用方式非常简单，类似于jQuery的连缀操作，可以有选择地对通知进行定制。</p>
<p>public void toastInfo(string info) {<br>    //默认使用第0个模板，如果构造时候传入其他参数则可以使用其他模板<br>    ToastLib toastLib = new ToastLib();<br>    //需要将要传入makeToast的字符串写入一个List中<br>    List<string> toastStrs = new List<string>();<br>    toastStrs.Add(info);<br>    toastStrs.Add(“there’s no logo :(“);<br>    //最简单的toast，其余参数均使用默认<br>    toastLib.makeToast(toastStrs).showToast();<br>    //使用连缀操作进行toast定制化设置，最终调用showToast()进行展示，具体参数可以参考对于每一个函数的注释<br>    toastLib.makeToast(toastStrs).setToastTone(“IM”).setToastDuringTime(“long”).showToast();<br>}</string></string></p>
<h2 id="获取文中代码"><a href="#获取文中代码" class="headerlink" title="获取文中代码"></a>获取文中代码</h2><p>在GitHub的HelloBUPT项目中可以得到代码：<a href="https://github.com/imaginezz/helloBUPT/blob/master/beiyou/CommonLibrary/ToastLib.cs" target="_blank" rel="noopener">https://github.com/imaginezz/helloBUPT/blob/master/beiyou/CommonLibrary/ToastLib.cs</a></p>
<h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>Windows 10 UWP开发：如何弹出消息通知：<a href="http://edi.wang/post/2015/11/8/uwp-toast-notification?utm_source=tuicool&amp;utm_medium=referral" target="_blank" rel="noopener">http://edi.wang/post/2015/11/8/uwp-toast-notification?utm_source=tuicool&amp;utm_medium=referral</a></p>
<p>自适应和交互式 Toast 通知：<a href="https://msdn.microsoft.com/zh-cn/windows/uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts" target="_blank" rel="noopener">https://msdn.microsoft.com/zh-cn/windows/uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts</a></p>
<p>使用Nuget包发送本地通知：<a href="https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-sending-a-local-tile-notification" target="_blank" rel="noopener">https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-sending-a-local-tile-notification</a></p>
<p>ToastNotification Class：<a href="https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.ui.notifications.toastnotification.aspx" target="_blank" rel="noopener">https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.ui.notifications.toastnotification.aspx</a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
  </section>

  
  <nav class="pagination">
    <a class="extend prev" rel="prev" href="/page/3/"><i class="fa fa-angle-left" aria-label="Previous page"></i></a><a class="page-number" href="/">1</a><span class="space">&hellip;</span><a class="page-number" href="/page/3/">3</a><span class="page-number current">4</span><a class="page-number" href="/page/5/">5</a><span class="space">&hellip;</span><a class="page-number" href="/page/9/">9</a><a class="extend next" rel="next" href="/page/5/"><i class="fa fa-angle-right" aria-label="Next page"></i></a>
  </nav>



          </div>
          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/images/avatar.jpg"
                alt="Jason Bian" />
            
              <p class="site-author-name" itemprop="name">Jason Bian</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          
            <nav class="site-state motion-element">
              
                <div class="site-state-item site-state-posts">
                
                  <a href="/archives/">
                
                    <span class="site-state-item-count">86</span>
                    <span class="site-state-item-name">posts</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-categories">
                  
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">41</span>
                    <span class="site-state-item-name">categories</span>
                  
                </div>
              

              
                
                
                <div class="site-state-item site-state-tags">
                  
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">109</span>
                    <span class="site-state-item-name">tags</span>
                  
                </div>
              
            </nav>
          

          

          

          
          

          
          

          
            
          
          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2018</span>
  <span class="with-love" id="animate">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">Jason Bian</span>

  

  
</div>




  <div class="powered-by">Powered by <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a></div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">Theme – <a class="theme-link" target="_blank" href="https://theme-next.org">NexT.Gemini</a></div>




        








        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    
	
    

    
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>


























  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=6.4.0"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=6.4.0"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=6.4.0"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=6.4.0"></script>



  

  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=6.4.0"></script>



  



  










  





  

  

  

  

  
  

  

  

  

  

  

</body>
</html>
